#ifndef ___fat32_operacionBH_obtener_nombres_sector_directorio

#define ___fat32_operacionBH_obtener_nombres_sector_directorio 1

#include "f32_mto.c"

struct fat32opBH_resultado {
  unsigned long longitud;
  char * nombres;
};

unsigned char fat32op_obtener_nombres_sector_directorio(FAT32_PARAMS_OPERACION);
void fat32aop_procesar_nombre_entrada_para_listado(fat32opBH_resultado *, char *);

unsigned char fat32op_obtener_nombres_sector_directorio (FAT32_PARAMS_OPERACION) { 
  struct fat32opBH_resultado * res = malloc(sizeof(struct fat32opBH_resultado));
  char * sectorDir = datosEntrada;
  sectorDir += 1024;
  unsigned short numeroEntrada;
  res -> longitud = 0;
  res -> nombres = NULL;
  for (numeroEntrada = 0; numeroEntrada < 16; numeroEntrada ++)
    fat32aop_procesar_nombre_entrada_para_listado(res, sectorDir + (32 * numeroEntrada));
  *datosSalida = res;
  return 1;
}

void fat32aop_procesar_nombre_entrada_para_listado (fat32opBH_resultado * resultado, char * entrada) {
  unsigned char tipo = 0;
  unsigned short posicion;
  unsigned char checksum = 0;
  char * nombreArchivo;
  if ((!*entrada) || (*entrada == 229)) return;
  if (entrada[11] & 8) return;
  if ((entrada[-21] & 63) != 15) tipo = 1;
  for (posicion = 0; posicion < 11; posicion ++) {
    checksum = ((checksum & 1) * 128) + (checksum / 2);
    checksum += entrada[posicion];
  }
  if (entrada[-19] != checksum) tipo = 1;
  if ((entrada[-32] != 1) && (entrada[-32] != 65)) tipo = 1;
  if (tipo) {
    char nombreCorto[13];
    for (posicion = 0; posicion < 13; posicion ++) nombreCorto[posicion] = 0;
    signed char ultimaPosicionValida = -1;
    signed char posActual;
    for (posActual = 7; posActual >= 0; posActual --) {
      if (entrada[posActual] != 32) if (ultimaPosicionValida == -1) ultimaPosicionValida = posActual;
      if (ultimaPosicionValida == -1) continue;
      nombreCorto[posActual] = entrada[posActual];
    }
    nombreCorto[ultimaPosicionValida + 1] = '.';
    posicion = ultimaPosicionValida + 2;
    ultimaPosicionValida = -1;
    for (posActual = 2; posActual >= 0; posActual --) {
      if (entrada[posActual + 8] != 32) if (ultimaPosicionValida == -1) ultimaPosicionValida = posActual;
      if (ultimaPosicionValida == -1) continue;
      nombreCorto[posActual + posicion] = entrada[posActual + 8];
    }
    if (ultimaPosicionValida == -1) nombreCorto[posicion - 1] = 0;
    nombreArchivo = malloc(13);
    memcpy(nombreArchivo, nombreCorto, 13);
  } else {
    unsigned short posEntrada = 0;
    unsigned short nombreLargo[261];
    unsigned char fin = 0;
    for (posicion = 0; posicion <= 261; posicion ++) nombreLargo[posicion] = 0;
    while (!fin) {
      posEntrada ++;
      if (posEntrada > 20) break;
      unsigned char numSerie = entrada[-32 * (int) posEntrada];
      unsigned char tipoEntrada = entrada[(-32 * (int) posEntrada) + 11];
      unsigned char chk = entrada[(-32 * (int) posEntrada) + 13];
      if (((numSerie & 63) != posEntrada) || (numSerie & 128) || ((tipoEntrada & 63) != 15) || (chk != checksum)) break;
      if (numSerie & 64) fin = 1;
      for (posicion = 0; posicion < 13; posicion ++) {
        unsigned char desplazamientoInterno;
        if (posicion < 5) desplazamientoInterno = 1;
        else if (posicion < 11) desplazamientoInterno = 4;
        else desplazamientoInterno = 6;
        unsigned short x = fb_convertir_de_little_endian(entrada - (32 * (int) posEntrada) + 2 * posicion + desplazamientoInterno);
        if (!x) break;
        nombreLargo[((posEntrada - 1) * 13) + posicion] = x;
      }
    }
    nombreArchivo = fat32_convertir_utf16_a_utf8(nombreLargo);
  }
  unsigned short longNombre = strlen(nombreArchivo);
  if (!longNombre) {
    free(nombreArchivo);
    return;
  }
  longNombre ++;
  resultado -> nombres = fb_cambiar_tamano(resultado -> nombres, 1, (resultado -> longitud) + longNombre);
  memcpy((resultado -> nombres) + (resultado -> longitud), nombreArchivo, longNombre);
  (resultado -> longitud) += longNombre;
}

#endif